package com.bm.service.Impl;

import cn.hutool.core.util.StrUtil;
import com.bm.exception.ExceptionCode;
import com.bm.exception.LoginException;
import com.bm.model.User;
import com.bm.service.IUserLoginService;
import com.bm.util.JwtUtil;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
public class UserLoginService implements IUserLoginService {

    List<User> users = new ArrayList<>();

    @Override
    public User register(User user) {
        String name1 = user.getName();
        for (User user1 : users) {
            if (Objects.equals(name1, user1.getName())) {
                throw new LoginException(ExceptionCode.USER_EXISTS);
            }
        }
        String pw1 = user.getPassword();
        PasswordFormat(pw1);
        String em = user.getEmail();
        verification(em);
        users.add(user);

        return null;
    }

    /**
     * 验证邮箱验证码
     *
     * @param em 用户邮箱
     */
    private void verification(String em) {
        Scanner scanner = new Scanner(System.in);
        int code = generateSixDigitCode();
        final Map<String, Integer> codes = new ConcurrentHashMap<>();
        codes.put(em, code);
        System.out.println("请输入收到的验证码：");
        int userInput = scanner.nextInt();

        int value = codes.get(em);
//        int userInput =value;
//        System.out.println("验证通过");
        if (userInput == value) {
            System.out.println("验证通过");
        } else throw new LoginException(ExceptionCode.CODE_ERROR);
    }

    //系统随机生成验证码
    public static int generateSixDigitCode() {
        int code = (int) ((Math.random() * 900000) + 100000);
        System.out.println(code);
        return code;
    }

    /**
     * 判断密码格式是否正确
     *
     * @param pw 密码
     */

    void PasswordFormat(String pw) {
        if (StrUtil.isBlank(pw)) {
            throw new LoginException(ExceptionCode.PASSWORD_FORMAT_ERROR);
        }
        if (isValidPassword(pw)) {
            System.out.println("密码格式正确");
        } else {
            throw new LoginException(ExceptionCode.PASSWORD_FORMAT_ERROR);
        }
    }

    // 正则表达式
    public static boolean isValidPassword(String password) {
        if (StrUtil.isBlank(password)) {
            return false;
        }
        // 正则表达式解释：
        // (?=.*[A-Za-z])   : 至少包含一个字母
        // (?=.*\\d)        : 至少包含一个数字
        // .{6,}            : 密码长度至少为6位
        // ^                : 匹配字符串的开始
        // $                : 匹配字符串的结束
        String regex = "^(?=.*[A-Za-z])(?=.*\\d).{8,}$";
        return password.matches(regex);
    }


    /**
     * 登录
     *
     * @param name     用户名
     * @param password 用户密码
     */
    @Override
    public String Login(String name, String password) {
        User user = new User();
        for (User user1 : users) {
            if (!Objects.equals(name, user1.getName()) || !Objects.equals(name, user1.getEmail())) {
                throw new LoginException(ExceptionCode.USER_NOTFOUND);
            }

            if (!Objects.equals(password, user1.getPassword())) {
                throw new LoginException(ExceptionCode.PASSWORD_ERROR);
            }

        }
        //使用stream流

//        List<User> list = users.stream().filter(user -> user.getName().equals(name)
//                && user.getPassword().equals(password)).collect(Collectors.toList());
//        if (list.isEmpty()){
//
//        }


        //登录成功后生成会话Token，有效期24小时。
        return generateSessionToken(user);

    }

    /**
     * 生成会话 Token
     *
     * @param user 登录成功的用户
     * @return 生成的会话 Token
     */
    private String generateSessionToken(User user) {

        // 将用户对象转换为 Map
        Map<String, Object> map = new HashMap<>();
        map.put("userName", user.getName());
        map.put("email", user.getEmail());

        // 创建 Token
        return JwtUtil.creatToken(user.getName(), map);
    }


    /**
     * 密码重置
     *
     * @param email    邮箱
     * @param password 密码
     * @return 成功
     */
    @Override
    public String PasswordRest(String email, String password) {
        //邮箱链接
        String baseUrl = "https://www.baidu.com/?tn=15007414_8_dg";
        String token = "abc123";

        long expiresAt = System.currentTimeMillis() + 60 * 60 * 1000L; // 1小时后过期
        //24 * 60 * 60 * 1000 ---24小时后过期

        String link = UriComponentsBuilder.fromHttpUrl(baseUrl)
                .queryParam(token)
                .queryParam(email)
                .encode() // 自动进行 URL 编码
                .build()
                .toUriString();
        String finallyLink = link + expiresAt;

        //新密码需两次输入一致，且不能与旧密码相同
        for (User user : users) {
            if (Objects.equals(password, user.getPassword())) {
                throw new LoginException(ExceptionCode.SAME_AS_OLD_PASSWORD);
            }
        }
        String pw1 = "qw12345678";
        if (!Objects.equals(password, pw1)) {
            throw new LoginException(ExceptionCode.DIFFERENT_PASSWORD);
        }
        return null;
    }
}
